Out: Monday, October 12, 2015
Due: Monday, October 19, 2015 at 600pm local time
The goal of this problem set is to help you design functions using higher-order functions like map, filter, foldr, etc.
You must use the HtDP Intermediate Student Language + Lambda to solve the problems. You are to use HOFs wherever it is appropriate. These will replace almost all the uses of the List template.
For these problems, download a copy of extras.rkt and put it in the folder with your solutions. Then import this library by including the line
(require "extras.rkt")at the top of your file with the other requires. Then, for each problem, put in lines that say
(provide function)for each deliverable function, as you have done on previous problem sets. This will allow our testing framework to import your file and do automated testing on it.
Remember that you must follow the design recipe. Your deliverables include the data definitions (including interpretation and templates), contract and purpose header, code, and tests. Be sure to follow our coding conventions. This will make the TA's job much easier.
Be sure to sync your work and fill out a Work Session Report at the end of every work session. Use the Work Session Report for PS05.
You are given a list of (student, class) pairs. Deliver a file called rosters.rkt that produces the class roster for each class that has at least one student enrolled. Here are more detailed specifications:
A SetOfX is a list of X's without duplication. Two SetOfX's are considered equal if they have the same members. Example: (list (list 1 2) (list 2 1)) is NOT a SetOfSetOfNumber, because (list 1 2) and (list 2 1) represent the same set of numbers. An Enrollment is a (make-enrollment Student Class) (make-enrollment s c) represents the assertion that student s is enrolled in class c. A ClassRoster is a (make-roster Class SetOfStudent) (make-roster c ss) represents that the students in class c are exactly the students in set ss. Student is unspecified, but you may assume that students may be compared for equality with equal? Class is unspecified, but you may assume that classes may be compared for equality with equal? Two ClassRosters are equal if they have the same class and equal sets of students. You are to provide the following functions: make-enrollment enrollment-student enrollment-class make-roster roster-classname roster-students roster=? : ClassRoster ClassRoster -> Boolean RETURNS: true iff the two arguments represent the same roster rosterset=? : SetOfClassRoster SetOfClassRoster -> Boolean RETURNS: true iff the two arguments represent the same set of rosters enrollments-to-rosters: SetOfEnrollment -> SetOfClassRoster GIVEN: a set of enrollments RETURNS: the set of class rosters for the given enrollments EXAMPLE: (enrollments-to-rosters (list (make-enrollment "John" "PDP") (make-enrollment "Kathryn" "Networks") (make-enrollment "Feng" "PDP") (make-enrollment "Amy" "PDP") (make-enrollment "Amy" "Networks"))) => (list (make-roster "PDP" (list "John" "Feng" "Amy")) (make-roster "Networks" (list "Kathryn" "Amy"))) In the output, the classes may be in any order, and the students in each class may be in any order.
As elsewhere in this problem set, use HOFs whenever possible and appropriate.
For your tests, you may use any data type for Student and Class. However, your code should not depend on your choice of data type; that is, it should work for any definition of Student and Class (so long as each is testable using equal?, as specified above).
Be sure that your tests accept any correct answer, not just the one that your function happens to produce. (Hint: don't use check-equal?; instead use check with an appropriate equality test.)
Last modified: Thu Oct 15 10:48:51 Eastern Daylight Time 2015